package com.ass.zookeeper.listen;

import lombok.extern.slf4j.Slf4j;
import org.I0Itec.zkclient.IZkChildListener;
import org.I0Itec.zkclient.ZkClient;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.context.event.ApplicationPreparedEvent;
import org.springframework.context.event.EventListener;
import org.springframework.stereotype.Component;

import java.util.List;

@Component
@Slf4j
public abstract class AbstractSubscribeParentNodes  {


    @Autowired
    private ZkClient zkClient;


    protected abstract String getPath();

    protected abstract void handler(String s, List<String> updateChildPathList);


    /**
     * 启动监听 要在spring 容器启动后 进行一些监听 以遍可以从ioc容器中 拿到想要的bean，
     * 否则使用@PostConstruct 注解 因为此注解是在bean初始化的时候执行 有一些业务的bean还没被加载到ioc里面
     * 可能有一些bean 加载不到
     *
     * @param event
     */
    @EventListener(ApplicationPreparedEvent.class)
    public void start(ApplicationPreparedEvent event) {
        try {
            subscribeParentNodes();
        } catch (Exception e) {
            log.error("[start异常]", e);
        }
    }


    //监听父节点下所有的子节点的变动
    public void subscribeParentNodes(){
        //监听父节点下的所有子节点
        zkClient.subscribeChildChanges(getPath(), new IZkChildListener() {
            @Override
            public void handleChildChange(String s, List<String> updateChildPathList) throws Exception {
                handler(s,updateChildPathList);
            }
        });
    }

}
